package tankgame03;

import java.util.Vector;

public class Tank {
    private int x, y;//坦克的横纵坐标
    private int direction;//坦克的方向，0123 分别对应为 上下左右
    private int speed = 5;//坦克的移动速度
    boolean isLive = true;
    private int shotInterval = 500;// 默认的两次最短射击间隔
    private long lastShotTime = 0;// 上次射击的时间
    Vector<Shot> shots = new Vector<>();////用Vector集合来存放多个射击子弹（线程）

    //增加成员，EnemyTank 可以得到敌方坦克的 Vector

    Vector<Tank> tanks = new Vector<>();


    //提供一个方法，可以让 MyPanel 的成员 Vector<EnemyTank> enemyTanks = new Vector<>();
    //设置到 EnemyTank 的成员 enemyTanks
    public void setTanks(Vector<Tank> tanks) {
        this.tanks = tanks;
    }

    //编写方法，判断当前的这个坦克，是否和其它的坦克发生碰撞
    public boolean isTouchTank() {
        //判断当前敌人坦克的方向
        switch (this.getDirection()) {
            case 0://当前坦克方向为 上 时
                //让当前敌人坦克和其它所有敌方坦克比较
                for (int i = 0; i < tanks.size(); i++) {
                    //从 Vector 中取出一个敌方坦克
                    Tank tank = tanks.get(i);
                    //不和自己比较
                    if (tank != this) {
                        //1.1如果敌方坦克的方向为 上 或 下
                        if (tank.getDirection() == 0 || tank.getDirection() == 1) {
                            //判断当前坦克的 左上角 坐标
                            if (this.getX() - 27 >= tank.getX() - 27 &&
                                    this.getX() - 27 <= tank.getX() + 27 &&
                                    this.getY() - 35 >= tank.getY() - 35 &&
                                    this.getY() - 35 <= tank.getY() + 35) {
                                return true;
                            }
                            //判断当前坦克的 右上角 坐标
                            if (this.getX() + 27 >= tank.getX() - 27 &&
                                    this.getX() + 27 <= tank.getX() + 27 &&
                                    this.getY() - 35 >= tank.getY() - 35 &&
                                    this.getY() - 35 <= tank.getY() + 35) {
                                return true;
                            }
                        }

                        //1.2如果敌方坦克的方向为 左 或 右
                        if (tank.getDirection() == 2 || tank.getDirection() == 3) {
                            //判断当前坦克的 左上角 坐标
                            if (this.getX() - 27 >= tank.getX() - 35 &&
                                    this.getX() - 27 <= tank.getX() + 35 &&
                                    this.getY() - 35 >= tank.getY() - 27 &&
                                    this.getY() - 35 <= tank.getY() + 27) {
                                return true;
                            }
                            //判断当前坦克的 右上角 坐标
                            if (this.getX() + 27 >= tank.getX() - 35 &&
                                    this.getX() + 27 <= tank.getX() + 35 &&
                                    this.getY() - 35 >= tank.getY() - 27 &&
                                    this.getY() - 35 <= tank.getY() + 27) {
                                return true;
                            }
                        }
                    }
                }
                break;
            case 1://当前坦克方向为 下 时
                //让当前敌人坦克和其它所有敌方坦克比较
                for (int i = 0; i < tanks.size(); i++) {
                    //从 Vector 中取出一个敌方坦克
                    Tank tank = tanks.get(i);
                    //不和自己比较
                    if (tank != this) {
                        //1.1如果敌方坦克的方向为 上 或 下
                        if (tank.getDirection() == 0 || tank.getDirection() == 1) {
                            //判断当前坦克的 左下角 坐标
                            if (this.getX() - 27 >= tank.getX() - 27 &&
                                    this.getX() - 27 <= tank.getX() + 27 &&
                                    this.getY() + 35 >= tank.getY() - 35 &&
                                    this.getY() + 35 <= tank.getY() + 35) {
                                return true;
                            }
                            //判断当前坦克的 右下角 坐标
                            if (this.getX() + 27 >= tank.getX() - 27 &&
                                    this.getX() + 27 <= tank.getX() + 27 &&
                                    this.getY() + 35 >= tank.getY() - 35 &&
                                    this.getY() + 35 <= tank.getY() + 35) {
                                return true;
                            }
                        }

                        //1.2如果敌方坦克的方向为 左 或 右
                        if (tank.getDirection() == 2 || tank.getDirection() == 3) {
                            //判断当前坦克的 左下角 坐标
                            if (this.getX() - 27 >= tank.getX() - 35 &&
                                    this.getX() - 27 <= tank.getX() + 35 &&
                                    this.getY() + 35 >= tank.getY() - 27 &&
                                    this.getY() + 35 <= tank.getY() + 27) {
                                return true;
                            }
                            //判断当前坦克的 右下角 坐标
                            if (this.getX() + 27 >= tank.getX() - 35 &&
                                    this.getX() + 27 <= tank.getX() + 35 &&
                                    this.getY() + 35 >= tank.getY() - 27 &&
                                    this.getY() + 35 <= tank.getY() + 27) {
                                return true;
                            }
                        }
                    }
                }
                break;
            case 2://当前坦克方向为 左 时
                //让当前敌人坦克和其它所有敌方坦克比较
                for (int i = 0; i < tanks.size(); i++) {
                    //从 Vector 中取出一个敌方坦克
                    Tank tank = tanks.get(i);
                    //不和自己比较
                    if (tank != this) {
                        //1.1如果敌方坦克的方向为 上 或 下
                        if (tank.getDirection() == 0 || tank.getDirection() == 1) {
                            //判断当前坦克的 左上角 坐标
                            if (this.getX() - 35 >= tank.getX() - 27 &&
                                    this.getX() - 35 <= tank.getX() + 27 &&
                                    this.getY() - 27 >= tank.getY() - 35 &&
                                    this.getY() - 27 <= tank.getY() + 35) {
                                return true;
                            }
                            //判断当前坦克的 左下角 坐标
                            if (this.getX() - 35 >= tank.getX() - 27 &&
                                    this.getX() - 35 <= tank.getX() + 27 &&
                                    this.getY() + 27 >= tank.getY() - 35 &&
                                    this.getY() + 27 <= tank.getY() + 35) {
                                return true;
                            }
                        }

                        //1.2如果敌方坦克的方向为 左 或 右
                        if (tank.getDirection() == 2 || tank.getDirection() == 3) {
                            //判断当前坦克的 左上角 坐标
                            if (this.getX() - 35 >= tank.getX() - 35 &&
                                    this.getX() - 35 <= tank.getX() + 35 &&
                                    this.getY() - 27 >= tank.getY() - 27 &&
                                    this.getY() - 27 <= tank.getY() + 27) {
                                return true;
                            }
                            //判断当前坦克的 左下角 坐标
                            if (this.getX() - 35 >= tank.getX() - 35 &&
                                    this.getX() - 35 <= tank.getX() + 35 &&
                                    this.getY() + 27 >= tank.getY() - 27 &&
                                    this.getY() + 27 <= tank.getY() + 27) {
                                return true;
                            }
                        }
                    }
                }
                break;
            case 3://当前坦克方向为 右 时
                //让当前敌人坦克和其它所有敌方坦克比较
                for (int i = 0; i < tanks.size(); i++) {
                    //从 Vector 中取出一个敌方坦克
                    Tank tank = tanks.get(i);
                    //不和自己比较
                    if (tank != this) {
                        //1.1如果敌方坦克的方向为 上 或 下
                        if (tank.getDirection() == 0 || tank.getDirection() == 1) {
                            //判断当前坦克的 右上角 坐标
                            if (this.getX() + 35 >= tank.getX() - 27 &&
                                    this.getX() + 35 <= tank.getX() + 27 &&
                                    this.getY() - 27 >= tank.getY() - 35 &&
                                    this.getY() - 27 <= tank.getY() + 35) {
                                return true;
                            }
                            //判断当前坦克的 右下角 坐标
                            if (this.getX() + 35 >= tank.getX() - 27 &&
                                    this.getX() + 35 <= tank.getX() + 27 &&
                                    this.getY() + 27 >= tank.getY() - 35 &&
                                    this.getY() + 27 <= tank.getY() + 35) {
                                return true;
                            }
                        }

                        //1.2如果敌方坦克的方向为 左 或 右
                        if (tank.getDirection() == 2 || tank.getDirection() == 3) {
                            //判断当前坦克的 右上角 坐标
                            if (this.getX() + 35 >= tank.getX() - 35 &&
                                    this.getX() + 35 <= tank.getX() + 35 &&
                                    this.getY() - 27 >= tank.getY() - 27 &&
                                    this.getY() - 27 <= tank.getY() + 27) {
                                return true;
                            }
                            //判断当前坦克的 右下角 坐标
                            if (this.getX() + 35 >= tank.getX() - 35 &&
                                    this.getX() + 35 <= tank.getX() + 35 &&
                                    this.getY() + 27 >= tank.getY() - 27 &&
                                    this.getY() + 27 <= tank.getY() + 27) {
                                return true;
                            }
                        }
                    }
                }
                break;

        }
        return false;
    }

    //上下左右移动方法
    public void moveUp() {//上
        if (y - 35 > 0 && !isTouchTank()) {
            y -= speed;
        } else if (y - 35 <= 0 && !isTouchTank()){
            y = 35;
        }
    }

    public void moveDown() {//下
        if (y + 35 < 900 && !isTouchTank()) {
            y += speed;
        } else if (y + 35 >= 900 && !isTouchTank()){
            y = 865;
        }
    }

    public void moveLeft() {//左
        if (x - 35 > 0 && !isTouchTank()) {
            x -= speed;
        } else if (x - 35 <= 0 && !isTouchTank()){
            x = 35;
        }
    }

    public void moveRight() {//右
        if (x + 35 < 1200 && !isTouchTank()) {
            x += speed;
        } else if (x + 35 >= 1200 && !isTouchTank()){
            x = 1165;
        }
    }

    //射击方法
    public void shotTank() {
        long currentTime = System.currentTimeMillis();//获取当前时间的毫秒数
        Shot shot = null;//在这里定义局部变量,而不是全局变量
        //如果两次射击的间隔时间小于规定的时间，则退出不射击
        if (currentTime - lastShotTime < shotInterval) {
            return;
        }
        lastShotTime = currentTime;//更新上次射击的时间
        //根据自己的坦克的位置和方向来创建 Shot 对象
        //子弹的直径为6
        switch (getDirection()) {
            case 0://向上
                shot = new Shot(getX() - 3, getY() - 35, 0);
                break;
            case 1://向下
                shot = new Shot(getX() - 3, getY() + 35, 1);
                break;
            case 2://向左
                shot = new Shot(getX() - 35, getY() - 3, 2);
                break;
            case 3://向右
                shot = new Shot(getX() + 35, getY() - 3, 3);
                break;
        }
        //将shot对象添加到集合中
        shots.add(shot);
        //启动射击 Shot 线程
        new Thread(shot).start();
    }

    public Tank(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getShotInterval() {
        return shotInterval;
    }

    public void setShotInterval(int shotInterval) {
        this.shotInterval = shotInterval;
    }


    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    public int getDirection() {
        return direction;
    }

    public void setDirection(int direction) {
        this.direction = direction;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }
}
